package middleware

import (
	"context"
	"github.com/gogf/gf/v2/errors/gcode"
	"github.com/gogf/gf/v2/net/ghttp"
	"zuHaoLib/expand/contexts"
	"zuHaoLib/expand/response"
	"zuHaoLib/expand/token"
	"zuHaoLib/utils/validate"
)

// ZuHaoAuthToken 后台鉴权中间件
func ZuHaoAuthToken(r *ghttp.Request) {
	var (
		ctx  = r.Context()
		path = r.URL.Path
	)
	// 不需要验证登录的路由地址
	if IsExceptLogin(ctx, path) {
		r.Middleware.Next()
		return
	}
	// 将用户信息传递到上下文中
	if err := DeliverUserContext(r); err != nil {
		response.JsonExit(r, gcode.CodeNotAuthorized.Code(), err.Error())
		return
	}
	// 不需要验证权限的路由地址
	if IsExceptAuth(ctx, path) {
		r.Middleware.Next()
		return
	}
	// 验证路由访问权限 todo
	r.Middleware.Next()
}

// IsExceptAuth 是否是不需要验证权限的路由地址
func IsExceptAuth(ctx context.Context, path string) bool {
	pathList := token.GetConfig().ExceptAuth
	for i := 0; i < len(pathList); i++ {
		if validate.InSliceExistStr(pathList[i], path) {
			return true
		}
	}
	return false
}

// DeliverUserContext 将用户信息传递到上下文中
func DeliverUserContext(r *ghttp.Request) (err error) {
	user, err := token.ParseLoginUser(r)
	if err != nil {
		return
	}
	contexts.SetUser(r.Context(), user)
	return
}

// IsExceptLogin 是否是不需要登录的路由地址
func IsExceptLogin(ctx context.Context, path string) bool {
	pathList := token.GetConfig().ExceptLogin
	for i := 0; i < len(pathList); i++ {
		if validate.InSliceExistStr(pathList[i], path) {
			return true
		}
	}
	return false
}
